#include "queue.h"
#include <malloc.h>

/*  函数功能：创建一个队列
    @param capacity : 队列最大容量
    @return : 返回创建后的队列
 */
DYMQueue DYMQueueCreate(size_t capacity)
{
    DYMQueue ret = {
        .capacity = capacity,
        .buff = NULL,
        .size = 0,
        .rear = 0,
        .front = 0,
    };
    // 在下面填写你的代码
    ret.buff = (DYMQueueDataType*)malloc((capacity + 1) * sizeof(DYMQueueDataType));
    if(ret.buff == NULL){
        printf("创建队列过程中，内存申请失败\n");
    }
    return ret;
}

/*
    函数功能：元素进队
    @param queue：待操作队列
    @param elem: 待进队元素
    @return：返回操作结果，1：进队成功，0：队列已满（或传入参数 queue 为空、或队列 buffer 为空），进队失败 
*/
int DYMQueuePush(DYMQueue *queue,DYMQueueDataType elem)
{
    int ret = 0;
    // 在下面填写你的代码
    if(queue != NULL && (queue->rear + 1) % (queue->capacity + 1) != queue->front)   // 队列没有满
    {   
        ret = 1;
        queue->buff[queue->rear] = elem;
        queue->size++;
        queue->rear = (queue->rear + 1) % (queue->capacity + 1);
    }
    return ret;
}

/*
    函数功能：元素出队
    @param queue：待操作队列
    @return：返回操作结果，1：出队成功，0：队列已空（或传入参数 queue 为空、或队列 buffer 为空），出队失败 
*/
int DYMQueuePop(DYMQueue *queue)
{
    int ret = 0;
    // 在下面填写你的代码
    if(queue != NULL && queue->rear != queue->front) // 队列不空
    {
        ret = 1;
        queue->size--;
        queue->front = (queue->front + 1) % (queue->capacity + 1);
    }
    return ret;
}

/*
    函数功能：获取队首元素，不执行出队操作
    @param queue：待操作队列
    @param elem: 队首元素将填入这个地址 
    @return：返回操作结果，1：获取成功，0：队列为空（或传入参数 queue 为空、或队列 buffer 为空），获取失败 
*/
int DYMQueueTop(DYMQueue *queue,DYMQueueDataType *elem)
{
    int ret = 0;
    // 在下面填写你的代码
    if(queue != NULL && queue->rear != queue->front) // 队列不空
    {
        ret = 1;
        *elem = queue->buff[queue->front];
    }
    return ret;
}

/*
    函数功能：销毁队列
    @param queue：待销毁队列
*/
void DYMQueueDestory(DYMQueue *queue)
{
    // 在下面填写你的代码
    if(queue != NULL)
        free(queue->buff);
    queue->buff = NULL;
    queue->capacity = 0;
    queue->front = 0;
    queue->size = 0;
    queue->rear = 0;
}